// 导入http-errors模块，用于创建HTTP错误对象
import createError from "http-errors";
// 导入express模块，用于创建Web服务器
import express from "express";
// 导入path模块，用于处理文件路径
import path from "node:path";
// 导入cookie-parser模块，用于解析HTTP请求中的Cookie
import cookieParser from "cookie-parser";
// 导入morgan模块，用于记录HTTP请求日志
import logger from "morgan";
import "./db/index";

// 导入路由模块
import indexRouter from "./routes/index";
import usersRouter from "./routes/users";
import catalogRouter from "./routes/catalog";

// 创建Express应用程序实例
const app = express();

// 设置视图文件夹的路径
app.set("views", path.join(process.cwd(), "views"));
// 设置视图引擎为EJS
app.set("view engine", "pug");

// 使用morgan中间件记录HTTP请求日志，日志格式为'dev'
app.use(logger("dev"));
// 使用express.json()中间件解析JSON格式的请求体
app.use(express.json());
// 使用express.urlencoded()中间件解析URL编码的请求体，extended选项设置为false表示使用querystring库解析数据
app.use(express.urlencoded({ extended: false }));
// 使用cookie-parser中间件解析HTTP请求中的Cookie
app.use(cookieParser());
// 使用express.static()中间件提供静态文件服务，静态文件位于'public'目录下
app.use(express.static(path.join(process.cwd(), "public")));

// 使用'/'路由处理根路径的请求
app.use("/", indexRouter);
// 使用'/users'路由处理'/users'路径的请求
app.use("/users", usersRouter);
// 使用'/catalog'路由处理'/catalog'路径的请求
app.use("/catalog", catalogRouter);

// 处理404错误的中间件
app.use(function (req, res, next) {
  // 创建一个404错误对象并传递给下一个中间件
  next(createError(404));
});

// 错误处理中间件
app.use(function (err, req, res, next) {
  // 将错误信息设置到res.locals中，以便在模板中使用
  res.locals.message = err.message;
  // 根据环境变量判断是否将错误对象传递给模板，开发环境下传递完整错误对象，生产环境下传递空对象
  res.locals.error = req.app.get("env") === "development" ? err : {};

  // 设置响应的状态码为错误对象的状态码或500（服务器内部错误）
  res.status(err.status || 500);
  // 渲染'error'模板并发送响应
  res.render("error", { title: "error" });
});

export default app;
